import { GameObject } from '@/assets/GameObject.js'

/**
 * 技能类，继承自GameObject基类
 * 所有技能的父类
 */
export class SkillBase extends GameObject {
    /**
     * 构造函数
     * @param {Object} player 使用该技能的玩家对象
     * @param {number} cooldown 技能设计冷却时间(秒)
     */
    constructor(player, cooldown) {
        super()
        this.player = player
        this.currentCooldown = 0
        this.designedCooldown = cooldown
        this.gameMap = player.gameMap
        this.eps = 0.1
        this.skillKey = ''
        this.skillName = ''
        this.skillIcon = null
        this.skillIconLoaded = false
    }

    // 判断技能是否在冷却中
    is_on_cooldown() {
        return this.currentCooldown > this.eps
    }

    // 更新冷却时间
    update_cooldown() {
        this.currentCooldown -= this.timeDelta / 1000
        this.currentCooldown = Math.max(this.currentCooldown, 0)
    }

    // 重置冷却时间
    reset_cooldown() {
        this.currentCooldown = this.designedCooldown
    }

    // 加载技能图标
    load_skill_icon(iconUrl) {
        this.skillIcon = new Image()
        this.skillIcon.src = iconUrl
        this.skillIcon.onload = () => {
            this.skillIconLoaded = true
        }
    }

    // 释放技能
    cast() {
        // 如果技能在冷却中，返回失败
        if (this.is_on_cooldown()) {
            return false
        }

        // 重置冷却时间
        this.reset_cooldown()
        return true
    }

    update() {
        // 如果技能正在冷却中，更新冷却时间
        if (this.is_on_cooldown()) {
            this.update_cooldown(this.timeDelta)
        }
    }

    // 绘制技能图标
    draw_skill_icon(x, y, r, scale) {
        // 如果图标未加载，直接返回
        if (!this.skillIconLoaded) {
            return
        }

        // 绘制技能图标(圆形裁剪)
        this.gameMap.ctx.save()
        this.gameMap.ctx.beginPath()
        this.gameMap.ctx.arc(x * scale, y * scale, r * scale, 0, Math.PI * 2)
        this.gameMap.ctx.stroke()
        this.gameMap.ctx.clip()
        this.gameMap.ctx.drawImage(
            this.skillIcon,
            (x - r) * scale,
            (y - r) * scale,
            r * 2 * scale,
            r * 2 * scale
        )
        this.gameMap.ctx.restore()

        // 在图标下方绘制快捷键文本
        this.gameMap.ctx.font = `${r * 0.8 * scale}px Arial`
        this.gameMap.ctx.fillStyle = 'white'
        this.gameMap.ctx.textAlign = 'center'
        this.gameMap.ctx.fillText(this.skillKey, x * scale, y * scale + r * 2 * scale)

        // 如果技能在冷却中，绘制冷却遮罩
        if (this.is_on_cooldown()) {
            this.gameMap.ctx.beginPath()
            this.gameMap.ctx.moveTo(x * scale, y * scale)
            // 绘制扇形遮罩(从12点方向顺时针减少)
            this.gameMap.ctx.arc(
                x * scale,
                y * scale,
                r * scale,
                -Math.PI / 2,
                Math.PI * 2 * (1 - this.currentCooldown / this.designedCooldown) - Math.PI / 2,
                true
            )
            this.gameMap.ctx.lineTo(x * scale, y * scale)
            this.gameMap.ctx.fillStyle = 'rgba(40, 40, 40, 0.6)' // 半透明黑色遮罩
            this.gameMap.ctx.fill()
        }
    }
}
